package com.telaxo.shooter2012.gfx {
	import com.telaxo.shooter2012.Engine;
	import com.telaxo.shooter2012.interfaces.Vaisseau;
	import com.telaxo.shooter2012.projectiles.LaserBlue;

	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.utils.Timer;

	/** 
	 * @author Jeremy 
	protected static var duree : int;
	 */
	public class Ship extends MovieClip implements Vaisseau {
		// Récupération de l'image du vaisseau
		[Embed(source="swf/Ship.swf")]
		private var Ressource : Class;
		public var currentWeapons : int = 1;
		private var latence : int = 15;
		// La variable latence, de type int, affectée à la valeur 10
		// Les deux variables de distance, qu'on déclare pour usage ultérieur
		private var distance_x : Number;
		private var distance_y : Number;
		// private var rotation2 : Number;
		private var stageRef : Stage;
		private var key : KeyObject;
		private var vx : Number = 0;
		// Variables pour le tir du vaisseau lorsque l'on fait clic
		private var isMouseDown : Boolean;
		private var canFire : Boolean;
		public var fireTimer : Timer;
		private var myVitX : Number;
		private var myVitY : Number;
		public var duree : Number = 300;
		private var hitBox : Sprite;
		public var delay : uint = 100;
		private var speed : Number = 0.5;
		private var lives : Number;
		private var engine : Engine;

		public function Ship(s : Stage, e : Engine) {
			// Récupére le moteur de jeu
			engine = e;
			// Nombre de vie
			lives = 3;
			duree = 300;
			isMouseDown = false;
			canFire = true;
			this.stageRef = s;
			key = new KeyObject(stageRef);
			fireTimer = new Timer(duree, 1);
			// Ajout de la hitbox
			hitBox = new Sprite();
			hitBox.graphics.drawRect(-10, -2, 20, 20);
			hitArea = hitBox;

			// Ajout de l'image du vaisseau
			var image : MovieClip = new Ressource();
			addChild(image);
			addChild(hitBox);
			// Evénements du vaisseau
			this.addEventListener(Event.COMPLETE, init, true, 0, true);
			fireTimer.addEventListener(TimerEvent.TIMER, fireTimerHandler, false, 0, true);
			this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
			this.stageRef.addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
			this.stageRef.addEventListener(MouseEvent.MOUSE_DOWN, cliquer);
			this.stageRef.addEventListener(MouseEvent.MOUSE_UP, relacheClic);
		}

		private function init(event : Event) : void {
			// Configure le nombre de vie du joueur
			engine.scoreHud.initLife(lives);
		}

		private function fireTimerHandler(event : TimerEvent) : void {
			canFire = true;
		}

		// Boucle du vaisseau
		private function onEnterFrame(e : Event) : void {
			var smokepuff : Smokepuff = new Smokepuff(stageRef, x, y);
			stage.addChild(smokepuff);

			// on calcule la distance entre l'objet et le curseur de la souris sur l'axe des x
			distance_x = stage.mouseX - this.x;
			// on calcule la distance entre l'objet et le curseur de la souris sur l'axe des y
			distance_y = stage.mouseY - this.y;
			myVitX = (distance_x) / latence;
			// on ajoute le d�calage divis� par la latence en x
			myVitY = (distance_y - 10) / latence;

			x += myVitX;
			y += myVitY;

			if (x > stageRef.stageWidth - 25) {
				x = stageRef.stageWidth - 25;
				vx = -vx;
			} else if (x < 25) {
				x = 25;
				vx = -vx;
			}

			if (y > stageRef.stageHeight - 25) {
				y = stageRef.stageHeight - 25;
			} else if (y < 25) {
				y = 25;
			}
		}

		// gére le tire
		private function loop(e : Event) : void {
			// if (isMouseDown) tirerLaser();
			if (isMouseDown) isHit();
		}

		private function cliquer(pEvt : MouseEvent) : void {
			isMouseDown = true;
		}

		private function relacheClic(pEvt : MouseEvent) : void {
			if (isMouseDown) {
				isMouseDown = false;
			}
		}

		public function supprimerVaisseau() : void {
		}

		// ACCESSEURS
		// Récupére les colisions du vaisseau
		public function get hit() : Sprite {
			return hitBox;
		}

		// Récupére le nombre de vie
		public function get life() : Number {
			return lives;
		}

		// Génére le laser si le joueur peux tirer
		public function tirerLaser() : void {
			if (canFire) {
				var leLaser : LaserBlue = new LaserBlue(stageRef, x, y, this, currentWeapons);
				this.stageRef.addChildAt(leLaser, 2);
				canFire = false;
				fireTimer.start();
			}
		}

		// Dommages du vaisseau
		public function isHit() : void {
			if (canFire) {
				lives--;
				engine.scoreHud.updateLife(lives);
				canFire = false;
				fireTimer.start();
			}
		}
	}
} 		
	
